/****************************************************************************
                Университет:    Санкт-Петербургский Политехнический Университет
                Кафедра:        Компьютерные системы и программные технологии
                Аспирант:       Быков Илья Иванович
                Программа:      Расчет коэффициентов распределения
                Модуль:         commands.h
                Назначение:
****************************************************************************/

#ifndef DOCUMENT_H
#define DOCUMENT_H

#include <QGraphicsView>
#include <QGraphicsPolygonItem>
#include <QGraphicsLineItem>

class QUndoStack;
class QTextStream;
class QGraphicsPolygonItem;
class QGraphicsLineItem;
class QGraphicsScene;
class QRectF;
class QGraphicsSceneMouseEvent;
class QPainterPath;
class Node;
class Edge;
class QLineEdit;

class Document : public QGraphicsView
{
    Q_OBJECT

public:
    Document(QWidget *parent = 0);
    ~Document();

    void addNode(Node *node, bool update = true);
    void removeNode(Node *node, bool update = true);

    void addEdge(Edge *edge, bool update = true);
    void removeEdge(Edge *edge, bool update = true);

    bool load(QTextStream &stream);
    void save(QTextStream &stream);

    QString fileName() const;
    void setFileName(const QString &fileName);

    void setBal(int number);
    int bal() const;

    QUndoStack *undoStack() const;

    // Первый незанятый номер узла
    int freeNodeNumber() const;

    QList<Node*> nodes() const;
    QList<Edge*> edges() const;

    QList<Node*> selectedNodes() const;
    QList<Edge*> selectedEdges() const;

    Node *getNodeByNumber(int number) const;
    void updateEdges() const;
    void updateCharacters() const;

    void deleteTemporaryFiles();

    QString TemporaryFile;
    QString ReportFile;

    int getPrecision();
    void setPrecision( int precision);

    bool getResistanceState();
    void setResistanceState(bool state);

signals:
    void documentChanged(const QString &message, int timeout);

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void resizeEvent(QResizeEvent *event);
    bool eventFilter(QObject *obj, QEvent *event);

protected slots:
    void balEditFinished();

private:
    int m_currentIndex;
    int m_mousePressIndex;
    QPoint m_mousePressOffset;
    bool m_resizeHandlePressed;
    QString m_fileName;

    QUndoStack *m_undoStack;
    Node *m_tmpSourceNode;
    Node *m_tmpDestNode;
    QPointF m_oldPos;
    int m_lastNodeNumber;
    QGraphicsProxyWidget *m_proxyWidget;
    Node *m_bal;
    QLineEdit *m_balEdit;

    int m_power_precision;
    bool m_resistance_visible;
};

#endif // DOCUMENT_H
